using UnityEngine;
using UnityEngine.Tilemaps;


// 表示可建造物的类
[System.Serializable]
public class Buildable
{
    // 该建造物所属的Tilemap
    [field: SerializeField]
    public Tilemap ParentTilemap { get; private set; }

    // 可建造物的类型
    [field: SerializeField]
    public BuildableItem BuildableType { get; private set; }

    // 可建造物的GameObject
    [field: SerializeField]
    public GameObject GameObject { get; private set; }

    // 可建造物在Tilemap中的坐标
    [field: SerializeField]
    public Vector3Int Coordinates { get; private set; }

    // 构造函数，用于初始化可建造物的属性
    public Buildable(BuildableItem type, Vector3Int coords, Tilemap tilemap, GameObject gameObject = null)
    {
        ParentTilemap = tilemap;
        BuildableType = type;
        Coordinates = coords;
        GameObject = gameObject;
    }

    //删除建筑
    public void Destroy()
    {
        if (GameObject != null)
        {
            Object.Destroy(GameObject);
        }
        else
        {
            ParentTilemap.SetTile(Coordinates, null);
        }
    }

    /// <summary>
    /// 在 CollisionSpace 上进行迭代，并执行指定的操作。
    /// </summary>
    /// <param name="action">要执行的操作委托</param>
    public void IterateCollisionSpace(RectIntExtensions.RectAction action)
    {
        // 调用 RectIntExtensions 类的 Iterate 方法，在 CollisionSpace 区域内迭代，并执行传入的操作委托
        BuildableType.CollisionSpace.Iterate(Coordinates, action);
    }

    /// <summary>
    /// 在 CollisionSpace 上进行迭代，并执行指定的操作，直到找到返回 true 的位置或完成迭代。
    /// </summary>
    /// <param name="action">要执行的操作委托</param>
    /// <returns>如果委托的返回值为 true，则返回 true；否则，返回 false。</returns>
    public bool IterateCollisionSpace(RectIntExtensions.RectActionBool action)
    {
        // 调用 RectIntExtensions 类的 Iterate 方法，在 CollisionSpace 区域内迭代，并执行传入的操作委托
        // 如果委托的返回值为 true，则立即返回 true
        // 否则，在所有位置完成迭代后返回 false
        return BuildableType.CollisionSpace.Iterate(Coordinates, action);
    }
}
